[따배도] - 도커 컨테이너 만들어보기


dockerfile의 개념과 컨테이너 이미지를 직접 만들어보고 배포해 봅시다.

무엇을 컨테이너로 만드는 건가요?

도커란 개발한 애플리케이션(실행파일)과 운영환경이 모두 들어있는 독립된 공간
기술 면접에서 조금 더 전문적으로 말하기 위해 필자는 “독립된 환경에서 하나의 애플리케이션을 구동시키기 위한 코드와 그 모든 종속성을 패키징 하는 기술”이라고 연습했었다…

  • 개발한 프로그램과 실행환경을 모두 컨테이너로 만듭니다.
  • MSA(Micro Service Architecture) 환경의 Polyglot 애플리케이션 운영
💡

Polyglot 란?

다양한 언어로(해당 서비스를 구성할 때 최적화 된 환경을 구축하기 위한 언어)으로 개발하여 하나의 큰 서비스를 이루는 것을 의미합니다.

컨테이너는 어떻게 만드나요? Dockerfile 이란?

Dockerfile

  • 컨테이너를 만들 수 있도록 도와주는 명령어 집합
  • Top-Down으로 해석하는 방식
  • 고유의 지시어(Instruction)을 가짐(FROM, COPY, CMD etc..)
  • 대소문자 구분하지 않으나 가독성을 위해 사용함
도커파일 문법

내가 만든 컨테이너를 배포하려면?

  • 도커 이미지 빌드 후 도커 허브에 push하기
$ docker build -t hello.js:lastst . # dockerimage build
$ docker login # dockerhub login
$ docker push hello.js:latest # dockerhub에 push

실습으로 컨테이너 만들고 배포하기

실습1 : nodejs 애플리케이션 컨테이너 만들기

  • 작업 폴더 생성 및 소스코드 생성
$ mkdir build && cd build # 폴더 만들고 진입
$ cat > hello.js
const http = require('http');
const os = require('os');
console.log("Test server starting...");

var handler = function(request, response) {
  console.log("Received request from " + request.connection.remoteAddress);
  response.wirteHead(200);
  response.end("Container Hostname: " + os.hostname() + "\n");
};

var www = http.createServer(handler);
www.listen(8080);
  • 도커 파일 생성
FROM node:12 # 베이스 이미지를 노드js로 지정
COPY hello.js / # 호스트 파일을 컨테이너 루트 디렉토리로 복사
CMD ["node", "/hello.js"] # 컨테이너 동작시 실행하는 코드
  • 도커파일의 이미지 생성
$ docker build -t hellojs:latest .
$ docker images # 이미지 생성 확인

실습2 : 우분투 기반의 웹서버 컨테이너 만들기

  • 작업 폴더 생성 및 진입
$ mkdir webserver && cd webserver
  • 도커 파일 생성
FROM ubuntu:18.04
LABEL maintainer="nickhealthy <alskadmlcraz1@gmail.com>"
# install apache
RUN apt-get update \
    && apt-get install -y apache2
RUN echo "TEST WEB" > /var/www/html/index.html
EXPOSE 80
CMD ["/usr/sbin/apache2ctl", "-DFOREGROUND"]
  • 도커 이미지 빌드
$ docker build -t webserver:v1 .
  • 도커 파일 실행
$ docker run -d -p 80:80 --name web webserver:v1

컨테이너 배포

$ docker login # 도커 허브 개인 레포지토리에 올리기 위한 로그인 절차
$ docker push -t <본인ID>/hellojs
$ docker push -t <본인ID>/webserver:v1 # 버전을 따로 명시하지 않아 latest인 경우 버전명은 생략 가능

혼자 연습해보기

기본 구성

  • 데비안 베이스이미지 사용
  • 무한 반복문 쉘 스크립트 작성
  • 도커 이미지 파일에 fortune 애플리케이션 설치 후 쉘 스크립트 실행하는 프로그램 작성
  • 확인절차

연습 시작

  • [webpage.sh] 파일
$ cat > webpage.sh
#!/bin/bash
mkdir /htdocs
while :
do
    /usr/games/fortune > /htdocs/index.html
    sleep 10
done
  • 도커 파일 생성
FROM debian:latest
COPY webpage.sh /
RUN apt-get update \
    && apt-get install -y fortune
RUN ["chmod", "+x", "./webpage.sh"] # 해당 파일을 copy 후 실행 권한이 없어서 따로 추가해 둠
CMD ["./webpage.sh"]
  • 도커 파일 생성 및 실행
$ docker build -t fortune:21.02 . # 도커 이미지 파일 생성
$ docker run -d --name fortune fortune:21.02 # 도커 파일 실행
  • 도커 실행 파일 내부에서 확인
$ docker exec -it fortune bash
# 쉘 스크립트에 작성한 경로 /htdocs/index.html 확인
$ cat /htdocs/index.html

정상적으로 실행되는 것을 확인할 수 있었습니다.


Hello, I'm@nickhealthy
개발자를 꿈꾸고, 파이썬과 클라우드에 관심이 많은 비전공자

Github